package com.saydc.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.saydc.dao.CapacitacionesDAO;
import com.saydc.dao.EmpleadosDAO;
import com.saydc.utils.FechaFinPuestoTrabajadoComparator;

public class Empleado implements Serializable{
	
	private static final long serialVersionUID = 1L;
	private int idEmpleado;
	private String legajo;
	private String nombre;
	private Expertise expertise;
	private Date fechaIngreso;
	private double remuneracion;
	private PuestoEspecifico puestoActual;
	private Set<PuestoTrabajado> puestosTrabajados;
	private List<Evaluacion> evaluaciones;
	private Set<Capacitacion> capacitacionesRealizadas;
	private Set<Capacitacion> capacitacionesPendientes;
	
	public Empleado(){
	}
	
	public Empleado(String legajo, String nombre, Expertise expertise, Date fechaIngreso, double remuneracion){
		super();
		this.legajo = legajo;
		this.nombre = nombre;
		this.expertise = expertise;
		this.fechaIngreso = fechaIngreso;
		this.remuneracion = remuneracion;
		this.puestosTrabajados = new HashSet<PuestoTrabajado>();
		this.evaluaciones = new ArrayList<Evaluacion>();
		this.capacitacionesRealizadas = new HashSet<Capacitacion>();
		this.capacitacionesPendientes = new HashSet<Capacitacion>();
	}

	public int getIdEmpleado() {
		return idEmpleado;
	}

	public void setIdEmpleado(int idEmpleado) {
		this.idEmpleado = idEmpleado;
	}

	public String getLegajo() {
		return legajo;
	}

	public void setLegajo(String legajo) {
		this.legajo = legajo;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public Expertise getExpertise() {
		return expertise;
	}

	public void setExpertise(Expertise expertise) {
		this.expertise = expertise;
	}

	public Date getFechaIngreso() {
		return fechaIngreso;
	}

	public void setFechaIngreso(Date fechaIngreso) {
		this.fechaIngreso = fechaIngreso;
	}

	public double getRemuneracion() {
		return remuneracion;
	}

	public void setRemuneracion(double remuneracion) {
		this.remuneracion = remuneracion;
	}

	public PuestoEspecifico getPuestoActual() {
		return puestoActual;
	}

	public void setPuestoActual(PuestoEspecifico puestoActual) {
		this.puestoActual = puestoActual;
	}

	public Set<PuestoTrabajado> getPuestosTrabajados() {
		return puestosTrabajados;
	}

	public void setPuestosTrabajados(Set<PuestoTrabajado> puestosTrabajados) {
		this.puestosTrabajados = puestosTrabajados;
	}

	public List<Evaluacion> getEvaluaciones() {
		return evaluaciones;
	}

	public void setEvaluaciones(List<Evaluacion> evaluaciones) {
		this.evaluaciones = evaluaciones;
	}

	public Set<Capacitacion> getCapacitacionesRealizadas() {
		return capacitacionesRealizadas;
	}

	public void setCapacitacionesRealizadas(Set<Capacitacion> capacitacionesRealizadas) {
		this.capacitacionesRealizadas = capacitacionesRealizadas;
	}

	public Set<Capacitacion> getCapacitacionesPendientes() {
		return capacitacionesPendientes;
	}

	public void setCapacitacionesPendientes(Set<Capacitacion> capacitacionesPendientes) {
		this.capacitacionesPendientes = capacitacionesPendientes;
	}

	public void agregarCapacitaciones(Set<Capacitacion> capacRecomendadas) {
		for(Capacitacion capacitacion : capacRecomendadas){
			if(this.poseeCapacitacionPendiente(capacitacion) == false){
				this.getCapacitacionesPendientes().add(capacitacion);
			}
			if(this.poseeCapacitacionRealizada(capacitacion) == true){
				this.getCapacitacionesRealizadas().remove(capacitacion);
			}
		}
		EmpleadosDAO dao = EmpleadosDAO.getInstance();
		dao.actualizaEmpleado(this);
	}

	private boolean poseeCapacitacionPendiente(Capacitacion capacitacion) {
		for(Capacitacion pendiente : this.getCapacitacionesPendientes()){
			if(pendiente.getIdCapacitacion() == capacitacion.getIdCapacitacion())
				return true;
		}
		return false;
	}

	public void capacitarPendiente(int idCapacitacion) {
		Capacitacion buscada = null;
		Set<Capacitacion> capPendientes = this.getCapacitacionesPendientes();
		for(Capacitacion pendiente : capPendientes){
			if(pendiente.getIdCapacitacion() == idCapacitacion){
				buscada = pendiente;
				break;
			}
		}
		this.getCapacitacionesRealizadas().add(buscada);
		capPendientes.remove(buscada);
		EmpleadosDAO dao = EmpleadosDAO.getInstance();
		dao.actualizaEmpleado(this);
	}

	public boolean agregarCapacitarPendiente(int idCapacitacion) {
		CapacitacionesDAO capDao = CapacitacionesDAO.getInstance();
		Capacitacion capacitacion = capDao.getCapacitacion(idCapacitacion);
		if(this.poseeCapacitacionPendiente(capacitacion) == true){
			return false;
		}
		this.getCapacitacionesPendientes().add(capacitacion);
		if(this.poseeCapacitacionRealizada(capacitacion)){
			this.getCapacitacionesRealizadas().remove(capacitacion);
		}
		EmpleadosDAO dao = EmpleadosDAO.getInstance();
		dao.actualizaEmpleado(this);
		return true;
	}

	public boolean agregarCapacitacionRealizada(int idCapacitacion) {
		CapacitacionesDAO capDao = CapacitacionesDAO.getInstance();
		Capacitacion capacitacion = capDao.getCapacitacion(idCapacitacion);
		if(this.poseeCapacitacionRealizada(capacitacion) == true){
			return false;
		}
		this.getCapacitacionesRealizadas().add(capacitacion);
		if(this.poseeCapacitacionPendiente(capacitacion)){
			this.getCapacitacionesPendientes().remove(capacitacion);
		}
		EmpleadosDAO dao = EmpleadosDAO.getInstance();
		dao.actualizaEmpleado(this);
		return true;
	}
	
	private boolean poseeCapacitacionRealizada(Capacitacion capacitacion) {
		for(Capacitacion realizada : this.getCapacitacionesRealizadas()){
			if(realizada.getIdCapacitacion() == capacitacion.getIdCapacitacion())
				return true;
		}
		return false;
	}

	public List<PuestoTrabajado> getPuestosTrabajadosOrderByFecha() {
		List<PuestoTrabajado> lista = new ArrayList<PuestoTrabajado>();
		lista.addAll(this.getPuestosTrabajados());
		Collections.sort(lista, new FechaFinPuestoTrabajadoComparator());
		return lista;
	}

}
